Prima di tutto non sempre il server è "a casa nostra", ma è gestito da una
socetà esterna in hosting (nela maggior parte dei casi) che difficilmente da'
completo accesso allo stesso (restrizioni/sicurezza ecc... comprese),
principalmente perchè si ha la necessità di avere una directory dove l'utente
può depositare il file che sta uploadando. Questo perchè il processo del Web
Server in esecuzione (che si occupa di gestire le richieste HTTP) è,
generalmente, mandato in esecuzione con uno user (che generalmente ha il nome
IUSR_nomecomputer con password non conosciuta) con i privilegi di NT al minimo
per questioni di sicurezza. Tra i privilegi di accesso ad una cartella dal quale
preleviamo una pagina HTML, per esempio, è poco raccomandato avere i privilegi
in scrittura.
Quindi bisogna avere una apposita cartella dove vengano
"caricati" i files e questa deve essere creata/gestita dalla società che
manutiene il Web Server.
Il problema principale è che non esiste
documentazione sul "come gestire" l'uploading via ASP. L'unica possibilità che
abbiamo, quindi, è di utilizzare componenti di terze parti. Non che questo
comporti un peggioramente delle prestazioni (anzi è il contrario) ma non sempre
possiamo installare dei componenti su un server che non è nostro. Infatti alcune
aziende danno completa libertà per l'utilizzo delle ASP (che non permette di
fare dei "danni", anche perchè il codice è controllabile a vista) ma, per loro
politica aziendale (molto corretta per'altro), non danno la possibilità di
installare dei componenti da remoto.
Un altro fatto è che questi componenti
sono delle "scatole chiuse" che ci permettono di fare quello che il
programmatore ha previsto. Non sono, in generale, open source. La conclusione
(nella maggior parte dei casi) è quella di avere una pagina ASP che permetta di
fare "solo ed esclusivamente" l'upload di file, mentre, per il programmatore,
sarebbe stato più comodo avere la possibilità di accedere sia al contenuto dei
file che agli input field inviati con la richiesta tramite un form HTML: ad
esempio con: request.form("uploadFile") si potrebbe avere il contenuto del file
per poi salvarlo nella directory.
Per tutti questi motivi ci si trova
nell'esigenza di creare un modulo ASP (da includere nelle pagine al momento in
cui serve) che permetta tutto quello che abbiamo appena accennato.
Partendo dalla documentazione ufficiale si legge che l'unico modo per accedere al contenuto del file uploadato è richiamare il metodo RequestBinary, nel seguente modo:
bytecount = Request.TotalBytes bytArray = Request.BinaryRead(bytecount)
dove bytecount è una variabile (long) che restituisce la lunghezza della
richiesta, mentre bytArray è un array che contiene i byte della
richiesta.
Putroppo (altra carenza del linguaggio) VBScript non ha delle
funzioni che convertono, in automatico, tutto un Array da byte a char (String),
quindi si dovrebbe fare (in teoria) un ciclo su ogni elemento dell'array per
creare una stringa di caratteri in questo modo:
For lngLoop = 0 To UBound(bytArray) - 1
strByteToString = strByteToString + Chr(bytArray(lngLoop))
Next
Questo loop potrebbe però rallentare molto il processo di uploading. L'unico escamottage che si potrebbe adottare, utilizzando le librerie standard di ADO è utilizzare il methodo "AppendChunk" dell'oggetto Field, che permette di "appendere" dati come ad un field di tipo long binary. Tuttavia, in questo contesto, viene utilizzato per essere, poi, restituito come stringa. Il tutto quindi si trasforma in:
Set rstTemp =
Server.CreateObject("ADODB.Recordset")
rstTemp.Fields.Append "bytArray",
adLongVarChar, lenb(bytArray)
rstTemp.Open
rstTemp.AddNew
rstTemp.Fields("bytArray").AppendChunk
bytArray
rstTemp.Update
strByteToString =
rstTemp("bytArray")
ottenendo nella variabile stringa strByteToString il contenuto serializzato della richiesta. A questo punto la richiesta è manipolabile con i metodi e le funzioni generalmente utilizzate, con VBScript (quali Mid e InStr).